18. 如何训练一个会思维链(CoT)的模型
训练一个会思维链(CoT)的模型,很多人的第一反应是:
收集几十万条
<think>数据直接训练。
实际上效果往往不好。
因为模型首先需要学会的不是推理能力,而是:
什么情况下应该输出<think>
<think>格式长什么样
<think>和最终答案如何区分
因此训练 CoT 模型通常采用:
从简单到复杂(Curriculum Learning,课程学习)
第一阶段:让模型学会 <think> 格式
刚开始不要给特别复杂的推理。
例如:
Input:
1+1=?
Output:
<think>
1+1=2
</think>
2
再例如:
Input:
中国首都是哪里?
Output:
<think>
这是一个事实性问题
中国首都是北京
</think>
北京
这里的重点不是推理。
而是:
学会输出格式
为什么不要一开始给长CoT
例如:
<think>
第一步...
第二步...
第三步...
...
1000字推理
</think>
此时模型可能连:
<think>
</think>
都还没学明白。
训练会变得不稳定。
推荐训练流程
graph TD
A[Base Model]
--> B[少量简单Think数据]
B --> C[学习Think格式]
C --> D[检查输出]
D --> E{是否正确输出Think?}
E -->|否| B
E -->|是| F[加入复杂推理数据]
F --> G[学习长CoT]
G --> H[RL优化推理]DeepSeek-R1 实际采用的方法
很多人误以为:
DeepSeek-R1
=
直接RL
实际上并不是。
R1经历了多个阶段。
DeepSeek-R1训练总览
可以简化为:
graph LR A[Base Model] --> B[SFT冷启动] --> C[Reasoning RL] --> D[生成更多推理数据] --> E[再次SFT] --> F[最终RL] --> G[DeepSeek-R1]
第一阶段:Cold Start SFT
论文发现:
直接让基础模型进入RL。
例如:
Prompt
↓
GRPO
↓
Reasoning
会出现很多问题:
- 中英文混杂
- 输出混乱
- 可读性差
- 推理过程不稳定
因此:
先做一次 SFT。
Cold Start Data
训练数据规模:
几千条高质量CoT
数量其实不大。
重点是:
格式统一
逻辑清晰
答案正确
例如:
Question
↓
<think>
Reasoning
</think>
Answer
流程
graph LR A[Base Model] --> B[Cold Start CoT Data] --> C[SFT] --> D[获得基础推理能力]
第二阶段:GRPO强化学习
接下来进入:
DeepSeek-R1-Zero
对应论文最著名的部分。
训练方式:
问题
↓
模型生成多个答案
↓
规则验证
↓
GRPO更新
奖励主要来自:
1 正确性奖励
例如:
23+17
答案:
40
奖励:
+1
2 格式奖励
例如:
<think>
...
</think>
奖励:
+1
DeepSeek-R1-Zero
流程:
graph TD A[Question] --> B[生成多个回答] B --> C[规则验证器] C --> D[GRPO] D --> E[R1-Zero]
R1-Zero出现的问题
论文中发现:
虽然推理能力变强。
但出现:
Language Mixing
例如:
<think>
First...
然后...
Therefore...
最后...
</think>
Readability差
推理过程很乱。
用户体验差
难以直接使用。
第三阶段:拒绝采样(Rejection Sampling)
这是R1论文一个重要创新。
让R1-Zero大量生成:
推理轨迹
例如:
Question
↓
10个回答
↓
选最好的
只保留:
正确
格式规范
逻辑清晰
的样本。
流程
graph TD A[R1-Zero] --> B[生成大量CoT] B --> C[规则验证] C --> D[DeepSeek-V3评审] D --> E[高质量推理数据]
论文最终得到:
600k
Reasoning Samples
第四阶段:构建最终SFT数据
推理数据:
600k
非推理数据:
200k
包括:
- Chat
- Writing
- Coding
- Tool Use
- Safety
最终:
600k + 200k
=
800k
为什么加入非推理数据
如果只训练:
<think>
模型会变成:
任何问题都开始思考
例如:
你好
模型:
<think>
用户在打招呼...
</think>
你好
非常浪费Token。
因此需要:
推理问题
→ Think
普通问题
→ 直接回答
第五阶段:最终SFT
使用:
800k
训练数据。
训练:
2 Epoch
作用:
统一模型行为。
第六阶段:最终RL
最后再进行一次RL。
这次奖励不仅包含:
推理正确性
Accuracy Reward
还包括:
人类偏好
Helpful
Harmless
Readable
最终得到:
DeepSeek-R1
DeepSeek-R1完整流程
graph TD A[DeepSeek-V3 Base] --> B[少量高质量CoT数据] B --> C[SFT Cold Start] C --> D[GRPO推理强化学习] D --> E[R1-Zero] E --> F[生成大量推理轨迹] F --> G[规则验证+拒绝采样] G --> H[600k推理数据] I[200k非推理数据] --> J[合并800k数据] H --> J J --> K[最终SFT] K --> L[最终RL
推理+偏好奖励] L --> M[DeepSeek-R1]
对实际训练CoT模型的启发
不要一开始准备几十万条复杂 <think> 数据。
更推荐:
第一步
100~1000条简单Think
学格式。
第二步
检查是否稳定输出Think
第三步
加入复杂CoT
学习推理。
第四步
RL优化
提升推理能力。
一句话总结
DeepSeek-R1最大的经验不是“用RL学会推理”,而是先用少量高质量CoT数据教会模型输出 <think> 格式,再通过RL激发推理能力,最后利用拒绝采样生成大规模推理数据完成能力扩展。 这也是目前训练 Reasoning Model 最主流的路线。